/**
 * 24. 两两交换链表中的节点
 *
 * 【中等】
 *
 * 给你一个链表，两两交换其中相邻的节点，并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题（即，只能进行节点交换）。
 *
 * 示例 1：
 * 【https://assets.leetcode.com/uploads/2020/10/03/swap_ex1.jpg】
 * 输入：head = [1,2,3,4]
 * 输出：[2,1,4,3]
 *
 * 示例 2：
 * 输入：head = []
 * 输出：[]
 *
 * 示例 3：
 * 输入：head = [1]
 * 输出：[1]
 */

import { ListNode } from '../utils/list'

function swapPairs(head: ListNode | null): ListNode | null {
	if (!head || !head.next) {
		return head
	}

	const dummy = new ListNode()
	dummy.next = head

	let prev = dummy
	let cur = head
	while (cur && cur.next) {
		let next = cur.next
		// 交换当前节点和下一个节点的指 next 指针指向
		cur.next = next.next
		next.next = cur
		// 前一个节点的 next 指针指向
		prev.next = next

		prev = cur
		cur = cur.next!
	}

	return dummy.next
}
